// 实现一个对象碾平方法 flatten

// function flatten(obj) {
//   // return xxx
// }

// // 用例如下：

const obj = {
  a: {
    b: { b1: 1 },

    c: 2,
  },

  d: [5, 6],

  e: [],

  f: "foo",
};

// flatten(obj);

// output:

// {

//   'a.b.b1': 1,

//   'a.c': 2,

//   'd[0]': 5,

//   'd[1]': 6,

//   'e[]': null,

//   f: 'foo',

// }

const flatten = (obj) => {
  //保存结果
  let res = {};
  //展开对象，确定如参是cur为当前遍历的值、keypath是上层的路径
  const digui = (cur, keypath) => {
    //终止条件为基本数据类型
    if (typeof cur != "object") {
      res[keypath] = cur;
      return;
    }
    //如果是对象
    if (typeof cur == "object" && cur !== null) {
      //如果是数组
      if (Array.isArray(cur) === true) {
        //保存数组
        //判空
        if (cur.length === 0) res[`${keypath}`] = null;
        //非空有可能是对象数组，进一步递归
        cur.forEach((item, index) => {
          digui(item, `${keypath}[${index}]`);
        });
      } else {
        //不是数组的对象
        for (const key in cur) {
          //防止改动原型链上的属性
          if (cur.hasOwnProperty(key)) {
            digui(cur[key], keypath ? `${keypath}.${key}` : key);
          }
        }
      }
    }
  };
  digui(obj);
  return res;
};
const output = flatten(obj);
console.log(output);
